package co.gov.medellin.ssti.sub.paoyer.common.exception;

/**
 * Representan el conjunto de errores de tipo sistema para el modulo common de
 * la aplicacion.
 */
public class CommonSystemException implements ModuleExceptionInterface {

	/**
	 * Informacion del modulo al que pertenece el error.
	 */
	private static final int COMMON_MODULE = 9;

	/**
	 * Representa un error que indica que el tipo de Excepcion Lanzada no existe
	 */
	public static final int TYPE_EXCEPTION_NOT_FOUND = COMMON_MODULE
			* SYSTEM_EXCEPTION + 1;

	/**
	 * Representa un error que indica que un modulo de la Excepcion lanzada, no
	 * pudo encontrarse desde ModuleExceptionFactory
	 */
	public static final int MODULE_EXCEPTION_NOT_FOUND = COMMON_MODULE
			* SYSTEM_EXCEPTION + 2;

	/**
	 * Representa un error que indica que un modulo de la Excepcion lanzada, no
	 * pudo ser creado
	 */
	public static final int MODULE_EXCEPTION_NOT_CREATED = COMMON_MODULE
			* SYSTEM_EXCEPTION + 3;

	/**
	 * Ocurrio un Error al Hacer casting en el ModuleExceptionFactory. El nombre
	 * de Clase que se paso no implementa la interfaz ModuleExceptionInterface
	 */
	public static final int CLASS_CAST_MODULE_EXCEPTION = COMMON_MODULE
			* SYSTEM_EXCEPTION + 4;

	/**
	 * Representa un error que indica que un Identificador de Excepcion no esta
	 * definido en la Clase que implementa la interfaz ModuleExceptionInterface
	 */
	public static final int IDENTIFY_EXCEPTION_NOT_FOUND = COMMON_MODULE
			* SYSTEM_EXCEPTION + 5;

	/**
	 * Representa un error que indica que una propiedad del archivo de
	 * propiedades no se encuentra registrada.
	 */
	public static final int PROPERTY_NOT_FOUND = COMMON_MODULE
			* SYSTEM_EXCEPTION + 6;

	/**
	 * Representa un error que indica que una propiedad del archivo de
	 * propiedades fue almacenada sin un valor asociado.
	 */
	public static final int PROPERTY_IS_NULL = COMMON_MODULE * SYSTEM_EXCEPTION
			+ 7;

	/**
	 * Representa un error que indica que no se obtuvo una conexion JDBC del
	 * DataSource.
	 */
	public static final int JDBC_CONNECTION_IS_NULL = COMMON_MODULE
			* SYSTEM_EXCEPTION + 8;

	/**
	 * Representa un error en la ejecucion de una consulta SQL.
	 */
	public static final int QUERY_EXCEPTION = COMMON_MODULE * SYSTEM_EXCEPTION
			+ 9;

	/**
	 * Error al cerrar la conexion JDBC.
	 */
	public static final int JDBC_CLOSE_EXCEPTION = COMMON_MODULE
			* SYSTEM_EXCEPTION + 10;

	/**
	 * Representa un error inesperado.
	 */
	public static final int JAVA_EXCEPTION_OCCURRED = COMMON_MODULE
			* SYSTEM_EXCEPTION + 11;

	/**
	 * Representa un error cuando se intenta leer el archivo de propiedades.
	 */
	public static final int ERROR_READING_PROPERTIES_FILE = COMMON_MODULE
			* SYSTEM_EXCEPTION + 12;

	/**
	 * Representa un error cuando se intenta trabajar con fechas.
	 */
	public static final int DATE_PARSE_EXCEPTION = COMMON_MODULE
			* SYSTEM_EXCEPTION + 13;

	/**
	 * No se pudo encontrar el data source configurado
	 */
	public static final int CANNOT_FIND_DATASOURCE = COMMON_MODULE
			* SYSTEM_EXCEPTION + 14;

	/**
	 * Devuelve el ExceptionVO dependiendo el Id del mensaje
	 * 
	 * @param messageId
	 *            int Identificador del Mensaje. Este Mensaje tiene que estar
	 *            Definido como constante.
	 * @throws SystemException
	 * @return ExceptionVO
	 */
	public ExceptionVO getExceptionVO(int exceptionId)
			throws ExceptionIdNotFound {

		switch (exceptionId) {

		case TYPE_EXCEPTION_NOT_FOUND:
			return new ExceptionVO(
					CommonSystemException.TYPE_EXCEPTION_NOT_FOUND,
					CommonSystemException.COMMON_MODULE,
					"Tipo de Excepcion No Registrda.",
					"Revise en la Interface ModuleExceptionInterface y verifique "
							+ "que exista una constante definida para el tipo de Excepcion");

		case MODULE_EXCEPTION_NOT_FOUND:
			return new ExceptionVO(
					CommonSystemException.MODULE_EXCEPTION_NOT_FOUND,
					CommonSystemException.COMMON_MODULE,
					"Clase no Encontrada en el Sistema de Excepciones.",
					"Revise la Clase definida y verifique que el nombre "
							+ "de la Clase se encuentre escrita correctamente ");

		case MODULE_EXCEPTION_NOT_CREATED:
			return new ExceptionVO(
					CommonSystemException.MODULE_EXCEPTION_NOT_CREATED,
					CommonSystemException.COMMON_MODULE,
					"Clase del Modulo no pudo ser creada en el Sistema de Excepciones.",
					"Verifique que la Clase se encuentre bien compilada "
							+ "o verifique sus permisos de creaci�n ");

		case CLASS_CAST_MODULE_EXCEPTION:
			return new ExceptionVO(
					CommonSystemException.CLASS_CAST_MODULE_EXCEPTION,
					CommonSystemException.COMMON_MODULE,
					"Ocurrio un Error al Hacer Casting en ModuleExceptionFactory.",
					"Asegurese que la Clase Exception del modulo "
							+ "implemente la interfaz ModuleExceptionInterface");

		case IDENTIFY_EXCEPTION_NOT_FOUND:
			return new ExceptionVO(
					CommonSystemException.IDENTIFY_EXCEPTION_NOT_FOUND,
					CommonSystemException.COMMON_MODULE,
					"Identificador de Excepcion No Registrado.",
					"Revise en la Clase de ModuleExcepcion que implementa ModuleExceptionInterface "
							+ "que exista una constante definida para identificar la Excepcion");

		case PROPERTY_NOT_FOUND:
			return new ExceptionVO(
					CommonSystemException.PROPERTY_NOT_FOUND,
					CommonSystemException.COMMON_MODULE,
					"Propiedad de SAAW no encontrada.",
					"Revise el archivo de propiedades de SAAW y verifique que el nombre y el valor de la propiedad esten incluidos.");

		case PROPERTY_IS_NULL:
			return new ExceptionVO(CommonSystemException.PROPERTY_IS_NULL,
					CommonSystemException.COMMON_MODULE,
					"Nombre de Propiedad no puede ser NULL.",
					"El nombre de la propiedad enviado es null; revise el nombre de la propiedad.");

		case JDBC_CONNECTION_IS_NULL:
			return new ExceptionVO(
					CommonSystemException.JDBC_CONNECTION_IS_NULL,
					CommonSystemException.COMMON_MODULE,
					"Conexion JDBC del DataSource es NULL.",
					"Ocurrio un error obteniendo una conexion JDBC del DataSource."
							+ "Verifique que los parametros del data source sean correctos y "
							+ "que la base de datos y el listener esten funcionando correctamente.");
		case QUERY_EXCEPTION:
			return new ExceptionVO(
					CommonSystemException.QUERY_EXCEPTION,
					CommonSystemException.COMMON_MODULE,
					"Error ejecutando consulta SQL.",
					"Ocurrio un error cuando se ejecuto una consulta SQL."
							+ "Verifique que los datos enviados a la consulta sean validos o la version del esquema de base de datos.");

		case JDBC_CLOSE_EXCEPTION:
			return new ExceptionVO(
					CommonSystemException.JDBC_CLOSE_EXCEPTION,
					CommonSystemException.COMMON_MODULE,
					"Error cerrando conexion JDBC a la base de datos.",
					"Ocurrio un error cuando se intento cerrar una conexion JDBC a la base de datos."
							+ "Si el problema persiste, consulte con el administrador.");

		case JAVA_EXCEPTION_OCCURRED:
			return new ExceptionVO(
					CommonSystemException.JAVA_EXCEPTION_OCCURRED,
					CommonSystemException.COMMON_MODULE,
					"Ocurrio un error inesperado.",
					"El sistema arrojo un error inesperado. Consulte el trazo del error"
							+ "para mayor informacion.");

		case ERROR_READING_PROPERTIES_FILE:
			return new ExceptionVO(
					CommonSystemException.ERROR_READING_PROPERTIES_FILE,
					CommonSystemException.COMMON_MODULE,
					"Ocurrio un error al intentar leer el archivo"
							+ " de propiedades.",
					"Puede ser que el archivo no se encuentre donde deberia estar.");

		case DATE_PARSE_EXCEPTION:
			return new ExceptionVO(
					CommonSystemException.DATE_PARSE_EXCEPTION,
					CommonSystemException.COMMON_MODULE,
					"Ocurrio un error al intentar trabajar con las fechas.",
					"El sistema esta intentando trabajar erroneamente con una fecha. Algun valor"
							+ " que no se puede traducir a una fecha esta siendo ingresado en el sistema.");
		case CANNOT_FIND_DATASOURCE:
			return new ExceptionVO(
					CommonSystemException.CANNOT_FIND_DATASOURCE,
					CommonSystemException.COMMON_MODULE,
					"No se pudo encontrar el nombre del data source",
					"No se pudo encontrar el nombre del data source");

		default:
			throw new ExceptionIdNotFound(exceptionId);
		}
	}

	/**
	 * Obtiene un objeto <code>ModuleVO</code> que contiene el nombre del modulo
	 * y la clase que maneja las excepciones.
	 * 
	 * @return Objeto <code>ModuleVO</code> que contiene el nombre del modulo y
	 *         la clase que maneja las excepciones.
	 */
	public ModuleVO getModuleVO() {

		return new ModuleVO("COMMON", this.getClass().getName());
	}

}